const Panel = imports.ui.panel;
const Params = imports.misc.params;
const PlaceDisplay = imports.ui.placeDisplay;
+const RemoteSearch = imports.ui.remoteSearch;
const Tweener = imports.ui.tweener;
const ViewSelector = imports.ui.viewSelector;
const Wanda = imports.ui.wanda;
this.addSearchProvider(new DocDisplay.DocSearchProvider());
this.addSearchProvider(new ContactDisplay.ContactSearchProvider());
+ // Load remote search providers provided by applications
+ RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));
+
// TODO - recalculate everything when desktop size changes
this._dash = new Dash.Dash();
this._group.add_actor(this._dash.actor);
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
const Lang = imports.lang;
const St = imports.gi.St;
+const FileUtils = imports.misc.fileUtils;
const Search = imports.ui.search;
+const KEY_FILE_GROUP = 'Shell Search Provider';
+
const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
<method name="GetInitialResultSet">
<arg type="as" direction="in" />
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
+function loadRemoteSearchProviders(addProviderCallback) {
+ let dataDirs = GLib.get_system_data_dirs();
+ for (let i = 0; i < dataDirs.length; i++) {
+ let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
+ let dir = Gio.file_new_for_path(path);
+ if (!dir.query_exists(null))
+ continue;
+ loadRemoteSearchProvidersFromDir(dir, addProviderCallback);
+ }
+};
+
+function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
+ let dirPath = dir.get_path();
+ FileUtils.listDirAsync(dir, Lang.bind(this, function(files) {
+ for (let i = 0; i < files.length; i++) {
+ let keyfile = new GLib.KeyFile();
+ let path = GLib.build_filenamev([dirPath, files[i].get_name()]);
+
+ try {
+ keyfile.load_from_file(path, 0);
+ } catch(e) {
+ continue;
+ }
+
+ if (!keyfile.has_group(KEY_FILE_GROUP))
+ continue;
+
+ let remoteProvider;
+ try {
+ let group = KEY_FILE_GROUP;
+ let title = keyfile.get_locale_string(group, 'Title', null);
+ let icon = keyfile.get_string(group, 'Icon');
+ let busName = keyfile.get_string(group, 'BusName');
+ let objectPath = keyfile.get_string(group, 'ObjectPath');
+
+ remoteProvider = new RemoteSearchProvider(title,
+ icon,
+ busName,
+ objectPath);
+ } catch(e) {
+ log('Failed to add search provider "%s": %s'.format(title, e.toString()));
+ continue;
+ }
+
+ addProviderCallback(remoteProvider);
+ }
+ }));
+
+};
+
const RemoteSearchProvider = new Lang.Class({
Name: 'RemoteSearchProvider',
Extends: Search.SearchProvider,